package configuracion;

import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import sesion_beans.DecanoEJBLocal;
import sesion_beans.ProgramaEJBLocal;
import vos.Decano;
import vos.Programa;

@ManagedBean
@ViewScoped
public class ProgramaBean {
	
	//-------------------------------------------------------------------------
	// Atributos
	//-------------------------------------------------------------------------
	
	@EJB(name = "ProgramaEJB/local")
	private ProgramaEJBLocal programaEJB;
	
	@EJB(name = "DecanoEJB/local")
	private DecanoEJBLocal decanoEJB;
	
	/** Es el programa  */
	private Programa programa = new Programa();
	
	/** El decano del programa */
	private Decano decano = new Decano();
	
	/** El decano a eliminar del programa */
	private Decano decanoAEliminar = new Decano();
	
	/** Es la accion a realizar */
	private String accion = "registrar";

	//-------------------------------------------------------------------------
	// Metodos
	//-------------------------------------------------------------------------
	
	/**
	 * Obtiene el programa 
	 * @return programa El programa
	 */
	public Programa getPrograma() {
		return programa;
	}

	/**
	 * Asigna el programa
	 * @param programa El programa que va a asignar
	 */
	public void setPrograma(Programa programa) {
		this.programa = programa;
	}
	
	/**
	 * Obtiene todos los programas de la base de datos
	 * @return Todos los programas de la base de datos
	 */
	public List<Programa> getProgramas(){
		return programaEJB.obtenerProgramas();
	}
	
	/**
	 * Adicionar el programa a la base de datos
	 */
	public void adicionarPrograma(){
		try {
			decano.setTipoPersona("Decano");
			decanoEJB.adicionar(decano);
			programa.setDecano(decano);
			programaEJB.adicionar(programa);
			decano.setPrograma(programa);
			decanoEJB.actualizar(decano);
			programa = new Programa();
			FacesMessage mensaje = new FacesMessage("El programa ha sido agregado");
			FacesContext.getCurrentInstance().addMessage(null, mensaje);
		} catch (Exception e) {
			FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR ,"El programa ya existe o el decano asignado ya existen","El programa ya existe  o el decano asignado ya existen");
			FacesContext.getCurrentInstance().addMessage(null, mensaje);
		}
	}
	
	/**
	 * Elimina un programa de la base de datos
	 */
	public void eliminarProgramaDeBD(){
		programaEJB.eliminar(programa);
	}
	
	/**
	 * Elimina el decano del programa 
	 */
	public void eliminarDecanoDeBD(){
		decanoEJB.eliminar(decanoAEliminar);
	}
	
	/**
	 * Actualiza un programa
	 */
	public void actualizarProgramaDeBD(){
		programaEJB.actualizar(programa);
		decanoEJB.actualizar(decano);
		FacesMessage mensaje = new FacesMessage("El programa ha sido actualizado");
		FacesContext.getCurrentInstance().addMessage(null, mensaje);
	}
	
	/**
	 * Cambia el decano de este programa
	 */
	public void cambiarDecanoDeBD(){
		System.out.println("El decano a eliminar es :" +decanoAEliminar);
		decanoEJB.eliminar(decanoAEliminar);
		decano.setTipoPersona("Decano");
		decanoEJB.adicionar(decano);
		programa.setDecano(decano);
		decano.setPrograma(programa);
		decanoEJB.actualizar(decano);
		FacesMessage mensaje = new FacesMessage("El decano ha sido cambiado");
		FacesContext.getCurrentInstance().addMessage(null, mensaje);
	}
	
	/**
	 * Obtiene el nombre de todos los programas existentes
	 * @return El nombre de todos los programas existentes
	 */
	@SuppressWarnings("unchecked")
	public List<String> getNombreProgramas(){
		return programaEJB.obtenerNombreDeProgramas();
	}

	/**
	 * Obtiene el decano de este programa
	 * @return El decano de este programa
	 */
	public Decano getDecano() {
		return decano;
	}

	/**
	 * Asigna el decano a este programa
	 * @param decano El decano de este programa
	 */
	public void setDecano(Decano decano) {
		this.decano = decano;
	}
	
	/**
	 * Obtiene el decano de este programa
	 * @return El decano de este programa
	 */
	public Decano getDecanoDePrograma(){
		return decanoEJB.obtenerDecano(programa);
	}
	
	/**
	 * Modifica la accion a realizar
	 */
	public void cancelar(){
		accion = "registrar";
		programa = new Programa();
		decano = new Decano();
	}

	/**
	 * Obtiene la accion a realizar
	 * @return La accion a realizar
	 */
	public String getAccion() {
		return accion;
	}

	/**
	 * Asigna la accion a realizar
	 * @param accion La accion a realizar
	 */
	public void setAccion(String accion) {
		this.accion = accion;
	}

	/**
	 * Obtiene el decano a eliminar
	 * @return El decano a eliminar
	 */
	public Decano getDecanoAEliminar() {
		return decanoAEliminar;
	}

	/**
	 * Asigna el decano a eliminar
	 * @param decanoAEliminar El decano a eliminar
	 */
	public void setDecanoAEliminar(Decano decanoAEliminar) {
		this.decanoAEliminar = decanoAEliminar;
	}

}
